package 滑动窗口And双指针.双指针;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/2/13 22:53
 */
public class leetcode1234替换子串得到平衡字符串 {
    /*
    滑动窗口And双指针.双指针 （或者 大小不固定的 滑动窗口！）
    注意一下 这个 窗口的单调性， 是怎么 个逻辑
    有点 反向思维！
     */

    public int solution(String s){
        int ans = s.length();
        char[] arr = s.toCharArray();
        // map  可以使用 哈希表， 也可以下面这样写
        int[] map = new int['X'];
        for(char ch : arr){
            map[ch]++;
        }
        int compare = ans / 4;
        /*
         这个判断 ， 可以 防止 l 走到 r 的 右边
         */
        if(map['Q'] <= compare && map['R'] <= compare && map['E'] <= compare && map['W'] <= compare){
            return 0;
        }
        int l = 0,r = 0;
        while(r < s.length()){
            //  明白 这整个流程的话， 这就很简单了
            map[arr[r]]--;
            while(map['Q'] <= compare && map['R'] <= compare && map['E'] <= compare && map['W'] <= compare){
                ans = Math.min(ans,r - l + 1);
                ++map[arr[l]];
                l++;
            }
            r++;
        }
        return ans;
    }

    /*
     居然 还可以 二分 ！
     */


}
